package com.example.permissionsystem1_1.system.aspect;

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * 对超管角色和admin账号进行操作的禁止
 */
@Component
@Aspect
@Slf4j
@Order(value = 100)//设置切面类之间的优先级,值越低优先级越高
public class SuperManageOperationAspect {
    /**
     * Pointcut 切入点
     */
    @Pointcut("@annotation(com.example.permissionsystem1_1.system.annotation.aspectAnnotation.SuperManageOperationAspectAnnotation)")
    public void superManageOperationPrevent(){}

    /**
     * 环绕通知
     */
    @Around(value = "superManageOperationPrevent()")
    public Object arround(ProceedingJoinPoint pjp) {
        try {
            log.debug("执行业务操作前,判断是否为超管角色和admin账号");
            if(supperManageOperationCheck(pjp)){//是对超管角色或admin账号的操作
                log.debug("是超管角色和admin账号,禁止操作");
                return null;
            }
            Object o =  pjp.proceed();//执行正常的业务代码
            log.debug("执行业务操作后,判断是否是对超管角色和admin账号的列表展示");

            return o;
        } catch (Throwable e) {
            log.error(pjp.getSignature() + " 出现异常： ", e);
            return new Exception(e);
        }
    }

    //本类的工具方法
    private boolean supperManageOperationCheck(ProceedingJoinPoint pjp){
        String className=pjp.getTarget().getClass().getName();
        className=className.substring(className.lastIndexOf(".")+1,className.length());
        String methodName=pjp.getSignature().getName();
        Object[] args=pjp.getArgs();

        Object arg=args[0];//我们的相关业务方法只有一个参数
        JSONObject jsonArg = JSONObject.parseObject(JSONObject.toJSON(arg).toString());
        //用户类:查看/修改/删除
        if("UserInfoServiceImpl".equals(className)&&
                ("selectById".equals(methodName)||
                "updateById".equals(methodName)||
                ("deleteById".equals(methodName)))){
            return Long.valueOf(String.valueOf(jsonArg.get("id"))).equals(1l)?true:false;
        }
        //角色类:查看/修改/删除
        if("RoleInfoServiceImpl".equals(className)&&
                ("selectById".equals(methodName)||
                        "updateById".equals(methodName)||
                        ("deleteById".equals(methodName)))){
            return Long.valueOf(String.valueOf(jsonArg.get("id"))).equals(1l)?true:false;
        }
        //部门用户类:查看/分配
        if("DepartmentUserServiceImpl".equals(className)&&
                ("selectAllDepartmentsByUserId".equals(methodName)||
                ("setDepartmentUserRelation".equals(methodName)))){
            return Long.valueOf(String.valueOf(jsonArg.get("userId"))).equals(1l)?true:false;
        }
        //用户角色类:查看
        if("userRoleServiceImpl".equals(className)&&
                "selectAllRolesByUserId".equals(methodName)){
            return Long.valueOf(String.valueOf(jsonArg.get("userId"))).equals(1l)?true:false;
        }
        //用户角色类:分配
        if("userRoleServiceImpl".equals(className)&&
                "setUserRoleRelation".equals(methodName)){
            return (Long.valueOf(String.valueOf(jsonArg.get("userId"))).equals(1l)||
                    Long.valueOf(String.valueOf(jsonArg.get("roleId"))).equals(1l))?true:false;
        }
        //角色功能类:查看/分配
        if("roleFunctionServiceImpl".equals(className)&&
                ("selectAllFunctionsByRoleId".equals(methodName)||
                        ("setRoleFunctionRelation".equals(methodName)))){
            return Long.valueOf(String.valueOf(jsonArg.get("roleId"))).equals(1l)?true:false;
        }
        return false;
    }

//    /**
//     * 方法执行前
//     */
//    @Before(value = "webLog()")
//    public void before(JoinPoint joinPoint){
//        logger.info("2、Before：方法执行开始...");
//        // 接收到请求，记录请求内容
//        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
//        assert attributes != null;
//        HttpServletRequest request = attributes.getRequest();
//        // 记录下请求内容
//        logger.info("URL : " + request.getRequestURL().toString());
//        logger.info("HTTP_METHOD : " + request.getMethod());
//        logger.info("IP : " + request.getRemoteAddr());
//        logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
//        logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs()));
//
//    }

//    /**
//     * 方法执行结束，不管是抛出异常或者正常退出都会执行
//     */
//    @After(value = "webLog()")
//    public void after(JoinPoint joinPoint){
//        logger.info("4、After：方法最后执行.....");
//    }

//    /**
//     * 方法执行结束，增强处理
//     */
//    @AfterReturning(returning = "ret", pointcut = "webLog()")
//    public void doAfterReturning(Object ret){
//        // 处理完请求，返回内容
//        logger.info("5、AfterReturning：方法的返回值 : " + ret);
//    }

//    /**
//     * 后置异常通知
//     */
//    @AfterThrowing(value = "webLog()")
//    public void throwss(JoinPoint joinPoint){
//        logger.error("AfterThrowing：方法异常时执行.....");
//    }



}
